package br.com.peri.rs.bean;

import java.lang.reflect.Type;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.peri.Pessoa;
import br.com.peri.enums.StatusPeriResponse;
import br.com.peri.exception.PeriWsException;
import br.com.peri.facade.PeriFacade;
import br.com.peri.rs.PessoaResource;
import br.com.peri.vo.PeriResponse;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

@Stateless
public class PessoaResourceBean implements PessoaResource {

	private static final long serialVersionUID = 1L;

	@Inject
	private PeriFacade periFacade;

	@Override
	public String salvarPessoa(String jsonPessoa) {
		Gson gson = new Gson();
		Pessoa pessoa = gson.fromJson(jsonPessoa, Pessoa.class);
		PeriResponse<Pessoa> retorno = new PeriResponse<Pessoa>();
		try {
			pessoa = periFacade.salvarPessoa(pessoa);
			retorno.setObjeto(pessoa);
			retorno.setStatus(StatusPeriResponse.SUCESSO);
		} catch (PeriWsException e) {
			retorno.setMensagens(e.getMessages());
			retorno.setStatus(StatusPeriResponse.ERRO);
		}
		Type type = new TypeToken<PeriResponse<Pessoa>>() {
		}.getType();
		return new Gson().toJson(retorno, type);
	}

	@Override
	public String atualizarPessoa(String jsonPessoa) {
		Gson gson = new Gson();
		Pessoa pessoa = gson.fromJson(jsonPessoa, Pessoa.class);
		PeriResponse<Pessoa> retorno = new PeriResponse<Pessoa>();
		try {
			pessoa = periFacade.atualizarPessoa(pessoa);
			retorno.setObjeto(pessoa);
			retorno.setStatus(StatusPeriResponse.SUCESSO);
		} catch (PeriWsException e) {
			retorno.setMensagens(e.getMessages());
			retorno.setStatus(StatusPeriResponse.ERRO);
		}
		Type type = new TypeToken<PeriResponse<Pessoa>>() {
		}.getType();
		return new Gson().toJson(retorno, type);
	}

	@Override
	public String excluirPessoa(Long idPessoa) {
		PeriResponse<Pessoa> retorno = new PeriResponse<Pessoa>();
		try {
			periFacade.excluirPessoa(idPessoa);
			retorno.setStatus(StatusPeriResponse.SUCESSO);
		} catch (PeriWsException e) {
			retorno.setMensagens(e.getMessages());
			retorno.setStatus(StatusPeriResponse.ERRO);
		}
		Type type = new TypeToken<PeriResponse<Pessoa>>() {
		}.getType();
		return new Gson().toJson(retorno, type);

	}

	@Override
	public String getPessoaPorCpfCnpj(String cpfCnpj) {
		Pessoa pessoa = periFacade.getPessoaPorCpfCnpj(cpfCnpj);
		return new Gson().toJson(pessoa);
	}

	@Override
	public String getPessoaPorId(Long id) {
		Pessoa pessoa = periFacade.getPessoaPorId(id);
		return new Gson().toJson(pessoa);
	}

	@Override
	public String listarTodasPessoas() {
		List<Pessoa> pessoas = periFacade.listarTodasPessoas();
		Type type = new TypeToken<List<Pessoa>>() {
		}.getType();
		return new Gson().toJson(pessoas, type);
	}

	@Override
	public String listarPessoas(String nome, String cpf, String cnpj) {
		List<Pessoa> pessoas = periFacade.listarPessoas(nome, cpf, cnpj);
		Type type = new TypeToken<List<Pessoa>>() {
		}.getType();
		return new Gson().toJson(pessoas, type);
	}

}
